using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Reflection;

namespace $safeprojectname$.Manager
{
    /// <summary>
    /// Enum helper class
    /// </summary>
    public class Enums
    {
        /// <summary>
        /// Récupère la liste des descriptions de chaque valeur de l'énumération
        /// </summary>
        /// <param name="enumType">Type de l'énum</param>
        /// <returns>Liste des descriptions</returns>
        public static List<string> GetDescriptions(Type enumType)
        {
            List<string> listOfDescription = new List<string>();
            foreach (string _enum in Enum.GetNames(enumType))
            {
                FieldInfo field = enumType.GetField(_enum);
                if (field != null)
                {
                    DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (attr != null)
                    {
                        listOfDescription.Add(attr.Description);
                    }
                }
            }
            return listOfDescription;
        }
    }

    /// <summary>
    /// Helper for Enum
    /// </summary>
    public static class EnumsExtension
    {
        /// <summary>
        /// Récupère une valeur d'énumération à partir d'une description
        /// </summary>
        /// <param name="value">Description de la valeur de l'énumération</param>
        /// <param name="enumType">Type de l'énumération</param>
        /// <returns>Valeur de l'énumération</returns>
        public static object FromEnum(this string value, Type enumType)
        {
            foreach (string _enum in Enum.GetNames(enumType))
            {
                FieldInfo field = enumType.GetField(_enum);
                if (field != null)
                {
                    DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (attr != null & value == attr.Description)
                    {
                        return Enum.Parse(enumType, _enum);
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// Retourne la description d'une valeur de l'énumération
        /// </summary>
        /// <param name="_enumValue">Valeur de l'énumération</param>
        /// <returns>Description de l'énumération</returns>
        public static string ToDescription(this Enum _enumValue)
        {
            Type enumType = _enumValue.GetType();
            foreach (string _enum in Enum.GetNames(enumType))
            {
                if (Enum.GetName(enumType, _enumValue) == _enum)
                {
                    FieldInfo field = enumType.GetField(_enum);
                    if (field != null)
                    {
                        DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                        if (attr != null)
                        {
                            return attr.Description;
                        }
                    }
                }
            }
            return null;
        }
    }
}
